package gui;

import dao.FileMeta;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.Window;
import service.SearchService;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

public class GUIController implements Initializable {
    @FXML
    private GridPane gridPane;

    @FXML
    private Label label;

    @FXML
    private Button button;

    @FXML
    private TextField textField;

    @FXML
    private TableView<FileMeta> tableView;

    private SearchService searchService = null;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // 在这里给输入框加上一个监听器，并且指定该监听器是针对text属性来进行监听
        textField.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                // 该方法会在每次用户修改输入框里面的内容时被自动调用
                // oldValue为旧值,而newValue为新值,此处为修改值后的操作
                if(label.getText().equals("当前未选择目录")){
                    freshTable(newValue,null);
                }else{
                    freshTable(newValue, label.getText());
                }
            }
        });
    }

    // 重新查询数据库，把新的查询结果设置到表格中
    private void freshTable(String query,String absolutePath){
        // 查询操作依赖于searchService对象
        if( searchService == null){
            System.out.println("searchService 尚未初始化,无法进行查询操作！");
            return;
        }
        // 把表格中的数据清空,需要先获取到 tabView 内部的集合类，再进行清空操作
        ObservableList<FileMeta> fileMetas = tableView.getItems();
        fileMetas.clear();
        // 重新查询，将新的查询结果添加到 tableView 中
        List<FileMeta> results = new ArrayList<>();
        if(absolutePath == null){
            results = searchService.searchByPattern(query);
        }else{
            results = searchService.searchByPathAndPattern(query,absolutePath);
        }
        fileMetas.addAll(results);
    }


    // 使用这个方法，作为鼠标点击事件的回调方法，这个方法需要一个参数mouseEvent
    // 虽然当前方法用不了该参数，但是自定义方法时还是要有该参数
    public void choose(MouseEvent mouseEvent){
        // 1) 先创建一个目录选择器对象
        DirectoryChooser directoryChooser = new DirectoryChooser();
        // 2) 把该对话框显示出来
        Window window = gridPane.getScene().getWindow();
        File file = directoryChooser.showDialog(window);
        if(file == null){
            System.out.println("当前用户选择的路径为空！");
            return;
        }
        label.setText(file.getAbsolutePath());

        if(searchService != null){
            searchService.shutDown();
        }

        // 让用户选择路径，初心就是程序对指定路径进行扫描，把扫描结果写入数据库
        searchService = new SearchService();
        searchService.init(file.getAbsolutePath());

        // 再把扫描结果写入表格中
        pathTable(file.getAbsolutePath());
    }

    private void pathTable(String absolutePath) {
        // 查询操作依赖于searchService对象
        if( searchService == null){
            System.out.println("searchService 尚未初始化,无法进行查询操作！");
            return;
        }
        // 把表格中的数据清空,需要先获取到 tabView 内部的集合类，再进行清空操作
        ObservableList<FileMeta> fileMetas = tableView.getItems();
        fileMetas.clear();
        // 重新查询，将新的查询结果添加到 tableView 中
        List<FileMeta> results = searchService.searchByPath(absolutePath);
        fileMetas.addAll(results);
    }
}
